/*
 * @Description: 接口要加上文件目录/admin/users/xxx
 * @Author: cy
 * @Date: 2024/12/3
 */

var express = require("express");
var router = express.Router();
const { Op } = require("sequelize");

const { User } = require("../../models");
const { NotFoundError } = require("../../utils/errors");
const { success, failure } = require("../../utils/responses");
const { setKey, getKey,delKey } = require('../../utils/redis');

/**
 * 公共方法：查询当前用户
 */
async function getUser(id) {
  const user = await User.findByPk(id);
  if (!user) {
    throw new NotFoundError(`ID: ${id}的用户未找到。`);
  }

  return user;
}

/*
 * $param
 * @return
 * @desc 用户列表，带模糊搜索
 * select * from Users where title like '%标题 10%'`
 * 分页
 * SELECT * FROM `Users` LIMIT offset, pageSize;
 * SELECT * FROM `Users` LIMIT 0, 10;第一页
 * SELECT * FROM `Users` LIMIT 10, 10;第二页
 * offset = (currentPage - 1) * pageSize
 * */
router.get("/usersList", async function (req, res, next) {

  try {
    const query = req.query;
    // 当前是第几页，如果不传，那就是第一页
    const currentPage = Math.abs(Number(query.currentPage)) || 1;

    // 每页显示多少条数据，如果不传，那就显示10条
    const pageSize = Math.abs(Number(query.pageSize)) || 10;

    // 计算 offset
    const offset = (currentPage - 1) * pageSize;

    // 定义查询条件
    const condition = {
      order: [["id", "DESC"]],
      limit: pageSize,
      offset: offset,
    };
    //  where 条件中 ，通用查询条件
    if (
      Object.entries(query)?.filter(
        (e) => !["currentPage", "pageSize"]?.includes(e?.[0])
      )?.length > 0
    ) {
      let obj = {};
      Object.entries(query)
        ?.filter((e) => !["currentPage", "pageSize"]?.includes(e?.[0]))
        ?.map((item) => {
          let key = item[0];
          let value = item[1];
          obj[key] = {
            [Op.like]: `%${value}%`,
          };
        });
      condition.where = obj;
    }

        // 缓存的 key，定义为：setting
        const cacheKey = 'userlist';
          // 读取缓存中的数据
    let userlist = await getKey(cacheKey);
    // 如果缓存中没有数据，就从数据库中读取
    if (!userlist) {
      userlist  = await User.findAndCountAll(condition);

      if (!userlist) {
        throw new NotFound('未找到用户列表，请联系cy。')
      }

      // 并将数据写入缓存-设置有效期为10秒-如果没有设置有效期，那么就一直存在
      await setKey(cacheKey, userlist,10);
    }


    // const data = await User.findAll(condition);
    success(res, "查询用户列表成功", {
      status: true,
      message: "查询用户列表成功。",
      data: {
        users: userlist?.rows,
        pagination: {
          total: userlist?.count,
          currentPage,
          pageSize,
        },
      },
      query,
    });
  } catch (error) {
    failure(res, error);
  }

  // res.json({
  //   status: true,
  //   message: "查询用户列表成功。",
  //   data: {
  //     users: rows,
  //     pagination: {
  //       total: count,
  //       currentPage,
  //       pageSize,
  //     },
  //   },
  //   query,
  // });
});
/* 根据ID获取用户详情 */
router.get("/", async function (req, res, next) {
  try {
    const user = await getUser(req.query.id);
    // 查询用户详情
    success(res, "查询用户成功。", { user });
  } catch (e) {
    // 如果没有找到，就抛出异常
    failure(res, e);
  }
});

/* 新增或者修改用户 */
router.post("/addOrUpdateUser", async function (req, res, next) {
  try {
    //根据ID区分创建还是更新
    if (req.body.id) {
      const user = await getUser(req.body.id);

      // 使用 req.body 获取到用户通过 POST 提交的数据，然后创建用户
      await user.update(req.body);
      success(res, "更新成功。", { user }, 200);
    } else {
      const user = await User.create(req.body);
      success(res, "创建成功。", { user }, 201);
    }
      // 删除缓存
      await delKey('userlist');
  } catch (error) {
    failure(res, error);
  }
});

/* 删除用户 */
router.delete("/deleteUserById", async function (req, res, next) {
  try {
    // 使用 req.body 获取到用户通过 POST 提交的数据，然后删除用户
    /*
     * $param
     * @return
     * @desc 或者先查询用户后，再删除，比如你想提示文字不存在，未找到，如下
     * const user = await User.findByPk(id);
     * await user.destroy();
     * */
    const user = await User.destroy({ where: { id: req.body.id } });
    await delKey('userlist');

    res.status(200).json({
      status: true,
      message: "操作成功。",
      data: user,
    });
  } catch (error) {
    res.status(500).json({
      status: false,
      message: "操作失败。",
      errors: [error.message],
    });
  }
});

module.exports = router;
